/**
 * 聊天消息模型
 */

// 消息类型枚举
const MESSAGE_TYPES = ['text', 'voice', 'image', 'system'];

// 发送者枚举
const SENDER_TYPES = ['user', 'assistant', 'system'];

/**
 * 验证消息数据
 * @param {Object} data - 消息数据
 * @returns {Object} 验证结果
 */
exports.validate = (data) => {
  const errors = [];
  
  // 验证消息类型
  if (!data.type) {
    errors.push('消息类型不能为空');
  } else if (!MESSAGE_TYPES.includes(data.type)) {
    errors.push(`无效的消息类型: ${data.type}，有效类型: ${MESSAGE_TYPES.join(', ')}`);
  }
  
  // 验证发送者
  if (!data.sender) {
    errors.push('发送者不能为空');
  } else if (!SENDER_TYPES.includes(data.sender)) {
    errors.push(`无效的发送者: ${data.sender}，有效发送者: ${SENDER_TYPES.join(', ')}`);
  }
  
  // 验证内容
  if (data.type === 'text' && (!data.content || data.content.trim() === '')) {
    errors.push('文本消息内容不能为空');
  }
  
  // 验证文件信息（对于语音和图片消息）
  if ((data.type === 'voice' || data.type === 'image') && data.fileInfo) {
    if (!data.fileInfo.url) {
      errors.push(`${data.type === 'voice' ? '语音' : '图片'}消息必须包含文件URL`);
    }
  }
  
  return {
    isValid: errors.length === 0,
    errors
  };
};

/**
 * 创建消息对象
 * @param {Object} data - 消息数据
 * @returns {Object} 消息对象
 */
exports.create = (data) => {
  // 基本消息结构
  const message = {
    id: data.id || null,
    type: data.type,
    sender: data.sender,
    content: data.content || '',
    timestamp: data.timestamp || new Date().toISOString()
  };
  
  // 添加文件信息（如果有）
  if (data.fileInfo) {
    message.fileInfo = {
      url: data.fileInfo.url,
      name: data.fileInfo.name || '',
      type: data.fileInfo.type || '',
      size: data.fileInfo.size || 0
    };
  }
  
  return message;
};

/**
 * 获取消息类型列表
 * @returns {Array} 消息类型列表
 */
exports.getMessageTypes = () => {
  return [...MESSAGE_TYPES];
};

/**
 * 获取发送者类型列表
 * @returns {Array} 发送者类型列表
 */
exports.getSenderTypes = () => {
  return [...SENDER_TYPES];
};